package net.codeyouth.codegen.util

import net.codeyouth.codegen.bean.Config
import net.codeyouth.framework.core.exception.NullPropertyException
import org.apache.commons.lang3.StringUtils
import org.slf4j.LoggerFactory

/**
 * @author Frank create on 16/2/22 13:21
 */
class StringUtil {

    private static final LOGGER = LoggerFactory.getLogger(Config.class)

    /**
     * 字符串下划线格式转为驼峰格式.
     *
     * @param str 下划线格式字符串
     * @return 驼峰格式字符串
     */
    static String underline2Hump(String str) {
        if (StringUtils.isBlank(str)) {
            return "";
        } else {
            int position;
            while (str.indexOf("_") > 0 ) {
                position = str.indexOf("_");
                if (position < str.length() - 1) {
                    str = str.substring(0, position) + firstUpper(str.substring(position + 1));
                } else {
                    str = str.replace("_", "");
                }
            }
        }
        return str;
    }

    /**
     * 字符串首字母小写.
     *
     * @param str 源字符串
     * @return 首字母小写字符串
     */
    static String firstLower(String str) {
        return StringUtils.uncapitalize(str);
    }

    /**
     * 字符串首字母大写.
     *
     * @param str 源字符串
     * @return 首字母大写字符串
     */
    public static String firstUpper(String str) {
        return StringUtils.capitalize(str);
    }

    /**
     * 使用指定分隔符分割字符串.
     *
     * @param src 源字符串
     * @param separator 分隔符
     * @return List<String>
     */
    static List<String> separate(String src, String separator = ",") {
        if (src == null || src.trim() == "") return null
        return src.split(separator)
    }

    /**
     * null 转换为空字符串.
     *
     * @param src 源字符串
     * @return String
     */
    static String null2Empty(String src) {
        return src == null ? "" : src
    }

    /**
     * 检查指定属性值是否为空, 为空则抛出异常, 不为空返回源字符串.
     *
     * @param src 源字符串
     * @param property 属性名
     */
    static String checkNull(String src, String property) {
        if (src == null || src.trim() == "") {
            LOGGER.error("${firstUpper property} can not be empty! Please set a value to that property!")
            throw new NullPropertyException("Property [${property}] can not be empty!")
        }
        return src
    }

}
